#include <rtthread.h>
#include "os_mq_proc.h"

#include "app_dbg_util.h"
#include "app_dbg_mp.h"
#include "app_dbg_cmd.h"
#include "app_dbg_sm.h"
#include "app_dbg_drv.h"

#define LOG_TAG               "dbg.mp"
#define LOG_LVL               LOG_LVL_DBG
#include "ulog.h"

extern os_mq_t app_dbg_msg_handle;    //消息句柄 
extern os_mq_t app_dbg_tx_handle;     //tx句柄 

static void app_dbg_mp_timer_proc(os_mq_data_pt ptMsg);
static void app_dbg_mp_up_ok_proc(os_mq_data_pt ptMsg);
static void app_dbg_mp_disconn_proc(os_mq_data_pt ptMsg);
static void app_dbg_mp_rx_proc(os_mq_data_pt ptMsg);
static void app_dbg_mp_tx_proc(os_mq_data_pt ptMsg);
static void app_dbg_mp_ask_proc(os_mq_data_pt ptMsg);

//消息组
static const os_mq_proc_t app_dbg_msg_proc_tab[] = 
{
    { APP_DBG_QMT_START,   NULL                      },
    { APP_DBG_QMT_TIMER,   app_dbg_mp_timer_proc     },
    { APP_DBG_QMT_UP_OK,   app_dbg_mp_up_ok_proc     }, 
    { APP_DBG_QMT_DISCONN, app_dbg_mp_disconn_proc   },    
    { APP_DBG_QMT_RX,      app_dbg_mp_rx_proc        },
    { APP_DBG_QMT_TX,      app_dbg_mp_tx_proc        },
    { APP_DBG_QMT_ASK,     app_dbg_mp_ask_proc       },    
    { APP_DBG_QMT_MAX,     NULL                      },

};


/************************************************************************
定时 消息
1000ms
************************************************************************/
static void app_dbg_mp_timer_proc(os_mq_data_pt ptMsg)
{
    app_dbg_util_item_proc();  //产测项处理
    app_dbg_sm_evt_proc(APP_DBG_SM_EVT_TIMER, NULL);  
}

/************************************************************************
上报成功 消息

************************************************************************/
static void app_dbg_mp_up_ok_proc(os_mq_data_pt ptMsg)
{
   app_dbg_sm_evt_proc(APP_DBG_SM_EVT_UP_OK, NULL);  
}

/************************************************************************
关闭连接 消息
************************************************************************/
static void app_dbg_mp_disconn_proc(os_mq_data_pt ptMsg)
{
    UINT8 dat = 0;
    rt_memcpy(&dat, (UINT8 *)ptMsg->mq_pt_data, 1);   
    app_dbg_sm_evt_proc(APP_DBG_SM_EVT_DISCONN, &dat);  
}

/************************************************************************
rx 消息
************************************************************************/
static void app_dbg_mp_rx_proc(os_mq_data_pt ptMsg)
{
    app_dbg_cmd_mp_analysis(ptMsg->mq_pt_data, ptMsg->mq_data_len);
}

/************************************************************************
tx 消息
************************************************************************/
static void app_dbg_mp_tx_proc(os_mq_data_pt ptMsg)
{   

}

/************************************************************************
ask 消息
************************************************************************/
static void app_dbg_mp_ask_proc(os_mq_data_pt ptMsg)
{
   
}

//=====================================================================================

/************************************************************************
消息检测

************************************************************************/
BOOL app_dbg_msg_tab_init()
{
    return os_mq_proc_array_init(APP_DBG_QMT_START, APP_DBG_QMT_MAX, ARRAY_SIZE(app_dbg_msg_proc_tab), app_dbg_msg_proc_tab); //消息组检查
}
   
/************************************************************************
消息调度

************************************************************************/
BOOL app_dbg_msg_proc(os_mq_data_pt msg)
{
   return os_mq_proc_func(APP_DBG_QMT_START, APP_DBG_QMT_MAX, app_dbg_msg_proc_tab, msg);  //消息处理
}

//=====================================================================================

/************************************************************************
发送定时 消息
1000ms
************************************************************************/
BOOL app_dbg_timer_msg_post()
{
    os_mq_data msg = {0};
    if (os_mq_get_mem(&msg, APP_DBG_QMT_TIMER, 0)){
        if (FALSE == os_mq_send(app_dbg_msg_handle, &msg, FALSE)){	
			return FALSE;	
        }
    } else{
        return FALSE;	   
    } 
    return TRUE;
}

/************************************************************************
上报成功 消息

************************************************************************/
BOOL app_dbg_up_ok_msg_post()
{
    os_mq_data msg = {0};
    if (os_mq_get_mem(&msg, APP_DBG_QMT_UP_OK, 0)){
        if (FALSE == os_mq_send(app_dbg_msg_handle, &msg, FALSE)){	
			return FALSE;	
        }
        return TRUE;
    } 
    return FALSE;
}

/************************************************************************
发送关闭连接 消息
************************************************************************/
BOOL app_dbg_disconn_msg_post(UINT8 dat)
{
    os_mq_data msg = {0};
    if (os_mq_get_mem(&msg, APP_DBG_QMT_DISCONN, 1)){
        rt_memcpy(msg.mq_pt_data, &dat, 1);
        if (FALSE == os_mq_send(app_dbg_msg_handle, &msg, FALSE)){	
			return FALSE;	
        }
    } else{
        return FALSE;	   
    } 
    return TRUE;

}

/************************************************************************
rx 消息包

************************************************************************/
BOOL app_dbg_rx_msg_post(UINT8 cmd, UINT8 *pdata, UINT16 datalen)
{
    os_mq_data msg = {0};
    if (os_mq_get_mem(&msg, APP_DBG_QMT_RX, datalen+1)){
        rt_memcpy(msg.mq_pt_data, &cmd, 1);
        rt_memcpy(&msg.mq_pt_data[1], pdata, datalen);
        if (FALSE == os_mq_send(app_dbg_msg_handle, &msg, FALSE)){	 
			return FALSE;	
        }
    } else{
        return FALSE;	   
    } 
    return TRUE;
}

/************************************************************************
tx 消息包
app_dbg_tx_handle
************************************************************************/
BOOL app_dbg_tx_msg_post(UINT8 cmd, UINT8 *pdata, UINT16 datalen, UINT8 cnt, UINT16 mill)
{
    dbg_tx_t tx={0};
    tx.cmd = cmd;
    tx.pdata = pdata;
    tx.datalen= datalen;
    tx.cnt = cnt;
    tx.mill = mill;
    os_mq_data msg = {0};
    if (os_mq_get_mem(&msg, APP_DBG_QMT_TX, sizeof(dbg_tx_t))){
        rt_memcpy(msg.mq_pt_data, (UINT8 *)&tx, sizeof(dbg_tx_t));
        if (FALSE == os_mq_send(app_dbg_tx_handle, &msg, FALSE)){	 
			return FALSE;	
        }
    } else{
        return FALSE;	   
    } 
    return TRUE;
}

/************************************************************************
ask 消息包

************************************************************************/
BOOL app_dbg_ask_msg_post()
{

    return FALSE;
}

